<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    /*   
需求：泡茶和泡咖啡
步骤      泡茶         泡咖啡
1        烧开水        烧开水
2        浸泡茶叶      冲泡咖啡
3        倒入杯子      倒入杯子
4        加柠檬        加糖
问题：如果客人不想加柠檬或糖怎么处理？(引入钩子来实现)
*/

    //定义父类
    var Drink = function () {};

    // 创建一个钩子函数
    Drink.prototype.isNeed = function () {
      return true;
    };
    /* 或 Drink.prototype.isNeed = function () {
    }; */

    Drink.prototype.firstStep = function () {
      console.log("烧开水");
    };

    Drink.prototype.secondStep = function () {};

    Drink.prototype.thirdStep = function () {
      console.log("倒入杯子");
    };

    Drink.prototype.fourthStep = function () {};

    Drink.prototype.init = function () {
      //定义模板(骨架)方法，在父类定义好要执行的算法
      this.firstStep(); //this指向当前实例化对象
      this.secondStep();
      this.thirdStep();
      if (this.isNeed()) {
        //默认为true，表示执行第四步操作
        this.fourthStep();
      }
    };

    // 泡茶方法重写
    var Tea = function () {}; //创建子类
    //在ES5中通过该方法实现子类对父类的继承(获得父类的所有属性和方法)原型链继承
    Tea.prototype = new Drink();
    // 重写父类中的方法(第2，4步)
    Tea.prototype.secondStep = function () {
      console.log("浸泡茶叶");
    };
    Tea.prototype.fourthStep = function () {
      console.log("加柠檬");
    };
    // 用钩子函数 判断是否需要加柠檬
    Tea.prototype.isNeed = function () {
      return confirm("泡茶是否需要加柠檬？");
    };

    // 泡咖啡方法重写
    var Coffee = function () {}; //创建子类
    //在ES5中通过该方法实现子类对父类的继承(获得父类的所有属性和方法)
    Coffee.prototype = new Drink();
    // 重写父类中的方法(第2，4步)
    Coffee.prototype.secondStep = function () {
      console.log("冲泡咖啡");
    };
    Coffee.prototype.fourthStep = function () {
      console.log("加糖");
    };
    Coffee.prototype.isNeed = function () {
      return confirm("泡咖啡是否需要加糖？"); //confirm为window对象的方法，如果单击"是"则返回true
    };

    // 实例化子类
    console.log("-----泡茶-------");
    var tea = new Tea();
    tea.init();
    console.log("-----泡咖啡-------");
    var coffee = new Coffee();
    coffee.init();
  </script>
</html>
